package initialize

import (
	"fmt"
	"wms/config"
	"wms/internal/model"
	"wms/pkg/database/mock_seed"
	"wms/pkg/database/seed"
	"wms/pkg/logger"

	"go.uber.org/zap"
)

// InitData 初始化所有数据
func InitData() error {
	// 执行数据库迁移
	if err := model.AutoMigrate(); err != nil {
		return fmt.Errorf("数据库迁移失败: %v", err)
	}

	// 初始化系统基础数据
	if err := initSystemData(); err != nil {
		return err
	}

	// 获取当前环境配置
	serverMode := config.GetConfig().Server.Mode

	// 只在非生产环境下初始化模拟数据
	if serverMode != "production" && serverMode != "release" {
		logger.Info("检测到非生产环境，正在初始化模拟数据...")
		// 初始化模拟数据(测试和开发环境使用)
		if err := initMockData(); err != nil {
			return err
		}
	} else {
		logger.Info("生产环境运行，跳过模拟数据初始化", zap.String("mode", serverMode))
	}

	return nil
}

// initSystemData 初始化系统必需的基础数据
func initSystemData() error {
	// 初始化角色数据
	if err := seed.InitRoles(); err != nil {
		return fmt.Errorf("初始化角色数据失败: %v", err)
	}

	// 初始化菜单数据
	if err := seed.InitMenus(); err != nil {
		return fmt.Errorf("初始化菜单数据失败: %v", err)
	}

	// 初始化用户数据
	if err := seed.InitUsers(); err != nil {
		return fmt.Errorf("初始化用户数据失败: %v", err)
	}

	return nil
}

// initMockData 初始化模拟数据(用于测试和开发)
func initMockData() error {
	// 初始化餐饮冻品分类
	if err := mock_seed.InitFrozenFoodCategories(); err != nil {
		return fmt.Errorf("初始化餐饮冻品分类失败: %v", err)
	}

	// 初始化餐饮冻品计量单位
	if err := mock_seed.InitFrozenFoodUnits(); err != nil {
		return fmt.Errorf("初始化餐饮冻品计量单位失败: %v", err)
	}

	// 初始化冷链食品供应商数据
	if err := mock_seed.InitFrozenFoodSuppliers(); err != nil {
		return fmt.Errorf("初始化冷链食品供应商数据失败: %v", err)
	}

	// 初始化餐饮冻品货物数据
	if err := mock_seed.InitFrozenFoodCargos(); err != nil {
		return fmt.Errorf("初始化餐饮冻品货物数据失败: %v", err)
	}

	// 初始化冷链食品客户数据
	if err := mock_seed.InitFrozenFoodCustomers(); err != nil {
		return fmt.Errorf("初始化冷链食品客户数据失败: %v", err)
	}

	// 初始化物流公司数据
	if err := mock_seed.InitLogisticsCompanies(); err != nil {
		return fmt.Errorf("初始化物流公司数据失败: %v", err)
	}

	// 初始化仓库和库位数据
	if err := mock_seed.InitWarehousesAndLocations(); err != nil {
		return fmt.Errorf("初始化仓库和库位数据失败: %v", err)
	}

	// 初始化示例库存数据（包含完整的入库示例）
	if err := mock_seed.InitSampleInventory(); err != nil {
		return fmt.Errorf("初始化示例库存数据失败: %v", err)
	}

	return nil
}
